﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;
using System.Threading;

using PEMS.Common;

namespace PEMS.Server
{
    public class ServerController
    {
        /// <summary>
        ///  legyártunk kevés mintaadatot
        /// </summary>
        public void mintaadat_gyartas()
        {
            lock (Intezmeny._lock)
            {

                Intezmeny.instance.emberek.felhasznaloHozzaadasa("h1", "hallgato 1", "hh", UserTypeEnum.hallgato);
                Intezmeny.instance.emberek.felhasznaloHozzaadasa("h2", "hallgato 2", "hh", UserTypeEnum.hallgato);
                Intezmeny.instance.emberek.felhasznaloHozzaadasa("t1", "oktato 1", "tt", UserTypeEnum.oktato);
                Intezmeny.instance.emberek.felhasznaloHozzaadasa("a1", "admin 1", "aa", UserTypeEnum.administrator);

                Intezmeny.instance.felevek.felevHozzaadasa("11/12", "2011/12 tavaszi szemeszter", DateTime.Parse("2012.02.01"), DateTime.Parse("2012.05.31"));
                Intezmeny.instance.felevek.felevHozzaadasa("12/13", "2012/13 tavaszi szemeszter", DateTime.Parse("2013.02.01"), DateTime.Parse("2013.05.31"));

                Intezmeny.instance.targyak.targyHozzaadasa("rfke", "Rendszerfejlesztes korszeru eszkozei");
                try
                {
                    Intezmeny.instance.felevek.getFelev("12/13").kurzusMeghirdetese("rfke_nappali", Intezmeny.instance.targyak.getTargy("rfke").megnevezes,
                                                                                    (Oktato)Intezmeny.instance.emberek.emberList["t1"], Intezmeny.instance.targyak.getTargy("rfke"));
                    Intezmeny.instance.felevek.getFelev("12/13").kurzusMeghirdetese("rfke_levelezo", Intezmeny.instance.targyak.getTargy("rfke").megnevezes,
                                                                                    (Oktato)Intezmeny.instance.emberek.emberList["t1"], Intezmeny.instance.targyak.getTargy("rfke"));
                    Intezmeny.instance.felevek.getFelev("12/13");
                    Intezmeny.instance.felevek.getFelev("12/13").getKurzus("rfke_nappali").vizsgaMeghirdetese(DateTime.Now, 5);

                    if (Intezmeny.instance.felevek.getFelev("12/13").getKurzus("rfke_nappali") != null)
                    {
                        Intezmeny.instance.felevek.getFelev("12/13").getKurzus("rfke_nappali").vizsgaMeghirdetese(DateTime.Now, 5);
                    }
                }
                catch (Exception e)
                {
                    // Nincs ilyen tárgy amit hirdetni lehet, vagy nincs ilyen oktató akit hozzá lehet rendelni, stb...
                    Console.WriteLine(e.Message);
                    Console.ReadLine();
                }                

            }
            return;

        }

        /// <summary>
        /// adatok HDD-re írása
        /// </summary>
        public void adatKiiras(string path)
        {
            lock (Intezmeny._lock)
            {
                XmlSerializer serializer;
                TextWriter WriteFileStream;

                serializer = new XmlSerializer(typeof(Emberek));
                WriteFileStream = new StreamWriter(path + "Emberek.xml", false);
                serializer.Serialize(WriteFileStream, Intezmeny.instance.emberek);
                WriteFileStream.Close();

                serializer = new XmlSerializer(typeof(Felevek));
                WriteFileStream = new StreamWriter(path + "Felevek.xml", false);
                serializer.Serialize(WriteFileStream, Intezmeny.instance.felevek);
                WriteFileStream.Close();

                serializer = new XmlSerializer(typeof(Targyak));
                WriteFileStream = new StreamWriter(path + "Targyak.xml", false);
                serializer.Serialize(WriteFileStream, Intezmeny.instance.targyak);
                WriteFileStream.Close();
            }

        }
        /// <summary>
        ///  HDD-ről adatok olvasása
        /// </summary>
        public void adatfelolvasas(string path)
        {
            XmlSerializer serializer;
            TextReader ReadFileStream;
            lock (Intezmeny._lock)
            {
                serializer = new XmlSerializer(typeof(Targyak));
                ReadFileStream = new StreamReader(path + "Targyak.xml", false);
                Intezmeny.instance.targyak = (Targyak)serializer.Deserialize(ReadFileStream);
                ReadFileStream.Close();

                serializer = new XmlSerializer(typeof(Emberek));
                ReadFileStream = new StreamReader(path + "Emberek.xml", false);
                Intezmeny.instance.emberek = (Emberek)serializer.Deserialize(ReadFileStream);
                ReadFileStream.Close();

                serializer = new XmlSerializer(typeof(Felevek));
                ReadFileStream = new StreamReader(path + "Felevek.xml", false);
                Intezmeny.instance.felevek = (Felevek)serializer.Deserialize(ReadFileStream);
                ReadFileStream.Close();

                //"referenciák" megújítása
                foreach (KeyValuePair<string, Felev> kvp in Intezmeny.instance.felevek.felevList)
                {
                    foreach (KeyValuePair<string, FelevJelentkezes> kvp1 in kvp.Value.jelentkezettList)
                    {
                        string tu = kvp1.Key;
                        kvp1.Value.hallgato = (Hallgato)Intezmeny.instance.emberek.emberList[tu];
                    }

                    foreach (KeyValuePair<string, Kurzus> kvp1 in kvp.Value.kurzusList)
                    {
                        string to = kvp1.Value.oktato.userName;
                        string tt = kvp1.Value.targy.id;
                        kvp1.Value.oktato = (Oktato)Intezmeny.instance.emberek.emberList[to];
                        kvp1.Value.targy = Intezmeny.instance.targyak.targyList[tt];

                        foreach (KeyValuePair<string, KurzusTagsag> kvp2 in kvp1.Value.kurzusTagList)
                        {
                            string tu = kvp2.Key;
                            kvp2.Value.felevJelentkezes = Intezmeny.instance.felevek.felevList[kvp.Key].jelentkezettList[tu];
                        }

                        foreach (KeyValuePair<string, VizsgaIdopont> kvp2 in kvp1.Value.vizsgaidopontList)
                        {
                            foreach (KeyValuePair<string, Vizsga> kvp3 in kvp2.Value.vizsgaList)
                            {
                                string ktagsagKey = kvp3.Key;
                                kvp1.Value.kurzusTagList[ktagsagKey].vizsgak.Add(kvp3.Value);
                            }
                        }
                    }

                }

            }
            return;
        }

    }
}
